/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Logic;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Ramiro
 */
public class LectorArchivoPPF {

    private File archivo = null;
    private FileReader fr = null;
    private BufferedReader br = null;
    private String ruta = "";
    //Datos para armar los vectores
    private int cantVectores = 0;
    private double index = 0;
    private int field = 0;
    private int group = 0;
    private int leaves = 0;
    private double leafTemp = 0;
    //Datos unicos para todos los campos
    private String cat3d = "";
    private String NombrePaciente = "";
    private String idPaciente = "";
    private String diagnosis = "";
    private String datePlan = "";
    private Fecha fecha;
    private String equipo = "";
    private String d_correction = "";
    //Datos para el calculo
    private double tdose = 0;
    private double tpercent = 0;
    private Vector<Vector> matriz;
    //Cantidad de campos del tratamiento
    private int fields = 0;
    //Nombre del archivo del que derivan los del tipo MLC
    private String file_name = "";

    /*
     * Constructor al que se le pasa como parámetro la ruta del archivo.
     */
    public LectorArchivoPPF(String path) {
        this.ruta = path;
    }

    public String getRuta() {
        return this.ruta;
    }

    /*
     * Abre el archivo PPF, obtiene los datos necesarios y los archivos MLC derivados
     */
    public Vector<Vector> AbrirArchivo() {
        String t = "";
        int nroLinea = 0; //Línea por la que se va leyendo
        int lineaTitles = 0; //linea donde se encuentra el titulo de cada campo
        int saltoInplane = 0; //cantidad de líneas desde el TITLE hasta donde está el valor de y
        int saltoCrossplane = 0; //cantidad de líneas desde el TITLE hasta donde está el valor de x
        int saltoUM = 0; //cantidad de líneas desde el TITLE hasta donde está el valor de UM
        int lineaField = 0; //línea donde empieza cada campo
        int fieldTemp = 0;
        Vector<Double> columna = new Vector<Double>(4);

        try {
            this.archivo = new File(ruta);
            this.fr = new FileReader(archivo);
            this.br = new BufferedReader(fr);
            this.file_name = archivo.getName();
            // Lectura del fichero linea por linea
            String linea = "";
            while ((linea = br.readLine()) != null) {
                t = linea;
                nroLinea++;
                if (linea.contains("CAT3D_VER")) { //Guardo la version del cat
                    this.cat3d = linea.substring((linea.indexOf("=") + 2), linea.length());
                }
                if (linea.contains("PATNAME")) { //Guardo el apellido del paciente para el nombre de archivo
                    this.NombrePaciente = linea.substring((linea.indexOf("=") + 2), linea.length());
                }
                if (linea.contains("PATID")) { //Guardo el identificador del paciente
                    this.idPaciente = linea.substring((linea.indexOf("=") + 2), linea.length());
                }
                if (linea.contains("DIAGNOSIS")) { //Guardo el diagnostico del paciente
                    this.diagnosis = linea.substring((linea.indexOf("=") + 2), linea.length());
                }
                if (linea.contains("DATE")) { //Guardo la fecha del diagnostico
                    this.fecha = new Fecha(linea.substring((linea.indexOf("=") + 2), linea.length()));
                }
                if (linea.contains("MACHINE")) { //Guardo el tipo de equipo
                    this.equipo = linea.substring((linea.indexOf("=") + 2), linea.length());
                }
                if (linea.contains("FIELDS")) {
                    String f = linea.substring((linea.indexOf('=') + 2), linea.length());
                    this.fields = Integer.parseInt(f);
                    this.matriz = new Vector<Vector>(field);
                }
                if (linea.contains("TDOSE =") && (this.field == fieldTemp)) {
                    String f = linea.substring((linea.indexOf('=') + 2), linea.length());
                    this.tdose = Double.valueOf(f);
                }
                if (linea.contains("TPERCENT =") && (this.field == fieldTemp)) {
                    String f = linea.substring((linea.indexOf('=') + 2), linea.length());
                    this.tpercent = Double.valueOf(f);
                }
                if (linea.contains("Density correction")) { //Guardo el estado de la Density Correction en el equipo
                    this.d_correction = linea.substring((linea.indexOf("O")), linea.length());
                }

                if (linea.contains("[Titles]")) { //Guardo el nro de linea donde está TITLES
                    lineaTitles = nroLinea;
                }
                if (linea.contains("INPLANE")) { //Guardo el nro de linea donde está el inplane
                    saltoInplane = nroLinea - lineaTitles;
                }
                if (linea.contains("CROSSPLANE")) { //Guardo el nro de linea donde está el crossplane
                    saltoCrossplane = nroLinea - lineaTitles;
                }
                if (linea.contains("MON. UNITS")) { //Guardo el nro de linea donde están las unidades de monitor
                    saltoUM = nroLinea - lineaTitles;
                }
                if (linea.contains("[FIELD_")) { //Comienzan los datos del primer campo
                    String f = linea.substring((linea.indexOf('_') + 1), linea.indexOf(']'));
                    columna.add(Double.valueOf(f));
                    lineaField = nroLinea;
                }
                if (nroLinea == (lineaField + saltoInplane)) { //Chequeo si es la linea correspondiente al valor de inplane
                    String f = linea.substring((linea.indexOf('_') + 1), linea.length());
                    columna.add(Double.valueOf(f));
                }
                if (nroLinea == (lineaField + saltoCrossplane)) { //Chequeo si es la linea correspondiente al valor de crossplane
                    String f = linea.substring((linea.indexOf('_') + 1), linea.length());
                    columna.add(Double.valueOf(f));
                }
                if (nroLinea == (lineaField + saltoUM)) { //Chequeo si es la linea correspondiente al valor de UM
                    String f = linea.substring((linea.indexOf('_') + 1), linea.length());
                    columna.add(Double.valueOf(f));
                    this.matriz.add(columna);
                    columna = new Vector<Double>(4);
                }

            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (null != fr) {
                    fr.close();
                }
            } catch (Exception e2) {
                e2.printStackTrace();
            }
        }
        return matriz;
    }

    /*
     * Retorna la cantidad de campos del tratamiento
     */
    public int getFields() {
        return this.fields;
    }

    /*
     * Retorna el nombre del archivo seleccionado
     */
    public String getFileName() {
        return this.file_name;
    }

    public String getCat3d() {
        return cat3d;
    }

    public String getNombrePaciente() {
        return NombrePaciente.replace('^', ' ');
    }

    public String getIdPaciente() {
        return idPaciente;
    }

    public String getDiagnosis() {
        return diagnosis;
    }

    public String getDatePlan() {
        return fecha.toString();
    }

    public String getEquipo() {
        return equipo;
    }

    public String getD_correction() {
        return d_correction;
    }

    public double getTdose() {
        return tdose;
    }

    public double getTpercent() {
        return tpercent;
    }
}
